package stack

/**
栈的算法题：
1、使用两个栈，实现一个队列

2、栈在括号表达式匹配中的应用
思路：
	a、扫描表达式序列
	b、如果是左括号，则压入栈，继续a步骤；
	c、如果是右括号，则从栈中弹出一个元素，并和右括号匹配，匹配成功，则继续a步骤，匹配失败，算法结束
	d、扫描所有表达式后，检查栈中是否为空，结果为空，则匹配成功，匹配失败

3、【重点，需要掌握】栈在表达式求值中的应用（中缀表达式，后缀表达式）
补充说明：
【重点，需要掌握】表达式转为二叉树，然后二叉树的前，中，后序对应表达式的前，中，后缀表达式

4、栈在递归调用中的应用
适合用"递归"算法解决：可以把原始问题转换为属性相同，但规模较小的问题
比如：计算正整数的阶乘；求斐波那契数列

5、如何把递归算法改造为非递归算法
思想：自定义栈，把递归算法改造为非递归算法
*/
func factorial(n int) int {
	if n == 0 || n == 1 {
		return 1
	}

	return n * factorial(n-1)
}
